package dao;

import java.io.Serializable;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

import modelo.Caracteristicaxsalon;
import modelo.Domicilio;
import modelo.Salon;
import modelo.TelefonoSalon;
import modelo.TipoEvento;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;

import util.HibernateUtil;

public class SalonDao implements Serializable {

	private static final long serialVersionUID = -5474035676702451824L;

	private Session session;
	SessionFactory sessionFactory = HibernateUtil.getSessionFactory();

	public SalonDao() {
		super();
	}

	public void guardarSalon(Salon salon, Domicilio dom,
			List<TipoEvento> eventos, List<Caracteristicaxsalon> c,
			List<TelefonoSalon> t) {
		session = sessionFactory.openSession();
		session.beginTransaction();

		try {
			
			session.save(dom);
			Long idDomicilio = ((BigInteger) session.createSQLQuery(
					"SELECT LAST_INSERT_ID()").uniqueResult()).longValue();
			int anInt = new BigDecimal(idDomicilio).intValueExact();
			dom.setIdDomicilio(anInt);
			
			// agrego domicilio al salon
			salon.setDomicilio(dom);

			// guardo los tipos de eventos del salon
			Set<TipoEvento> tipoEv = new HashSet<TipoEvento>();

			Iterator<TipoEvento> i = eventos.iterator();
			while (i.hasNext()) {
				TipoEvento te = (TipoEvento) i.next();
				tipoEv.add(te);
			}

			salon.setTipoeventos(tipoEv);

			// guardo el salon
			session.save(salon);

			// obtengo el id del salon para despues guardar las caracteristicas
			// por salon
			Long idSalon = ((BigInteger) session.createSQLQuery(
					"SELECT LAST_INSERT_ID()").uniqueResult()).longValue();

			// guardo los telefonos por salon
			Iterator<TelefonoSalon> ite = t.iterator();
			while (ite.hasNext()) {
				TelefonoSalon ts = (TelefonoSalon) ite.next();
				ts.setSalon(salon);
				salon.getTelefonoSalons().add(ts);
				session.save(ts);
			}

			// guardo las caracteristicas por salon a mano jaja
			Query query = session
					.createSQLQuery("INSERT INTO caracteristicaxsalon (idCaracteristica, idSalon, descripcionCaracteristica) VALUES (:valor1, :valor2, :valor3)");

			Iterator<Caracteristicaxsalon> it = c.iterator();
			while (it.hasNext()) {
				Caracteristicaxsalon ca = (Caracteristicaxsalon) it.next();
				query.setParameter("valor1", ca.getCaracteristica()
						.getIdCaracteristica());
				query.setParameter("valor2", idSalon);
				query.setParameter("valor3", ca.getDescripcion());
				query.executeUpdate();

			}

			session.getTransaction().commit();

		} catch (Exception e) {
			session.getTransaction().rollback();
		} finally {
			session.close();
		}

	}

}
